category: main
step: 2_staging
sub_step: 2_combine
doc_status: ready
language: rus
main_number: "04"macro combine
| Name | Category | In Main Macro | Doc Status |
|---|---|---|---|
| custom_union_relations | auxiliary | combine, create_dataset | ready |
| get_relations_by_re | auxiliary | normalize, combine | ready |
Макрос combine предназначен для объединения данных по каждому пайплайну.
Имя dbt-модели (=имя файла в формате sql в папке models) должно соответствовать шаблону:
combine_{название_пайплайна}.
Например, combine_events.
Внутри этого файла вызывается макрос:
{{ datacraft.combine() }}
Над вызовом макроса в файле будет указана зависимость данных через —depends_on. То есть целиком содержимое файла выглядит, например, вот так:
-- depends_on: {{ ref('join_appmetrica_events') }}
-- depends_on: {{ ref('join_ym_events') }}
{{ datacraft.combine() }}
Этот макрос принимает следующие аргументы:
params (по умолчанию: none)disable_incremental (по умолчанию: none)override_target_model_name (по умолчанию: none)date_from (по умолчанию: none)date_to (по умолчанию: none)limit0 (по умолчанию: none)Сначала макрос считает имя модели - либо из передаваемого аргумента (
override_target_model_name), либо из имени файла (this.name). При использовании аргумента override_target_model_name макрос работает так, как если бы находился в модели с именем, равным значению override_target_model_name.
Название модели, полученное тем или иным способом, разбивается на части по знаку нижнего подчёркивания. Например, название combine_events разобьётся на 2 части, из этих частей макрос возьмёт в работу:
pipeline_name → eventsМодели шага combine могут иметь названия из 2 или 3 частей, вторая часть всегда пайплайн.
Если модель относится к пайплайну registry, то у неё ещё есть линк. Например, для модели combine_registry_appprofilematching есть:
link_name → appprofilematchingЕсли имя модели не соответствует шаблону - макрос выдаст ошибку.
Далее макрос будет искать по паттерну соответствующие ему таблицы из предыдущего шага (join).
Паттерн для пайплайна registry:
'join' ~ '_[^_]+_' ~ pipeline_name ~ '_' ~ link_name
для всех остальных данных паттерн:
'join' ~ '_[^_]+_' ~ pipeline_name
Макрос находит все соответствующие таблицы благодаря работе другого макроса - get_relations_by_re.
Если никакие данные не будут найдены, макрос выдаст ошибку.
Далее полученные данные автоматически объединятся (UNION ALL) при помощи макроса custom_union_relations. Таким образом сформируется таблица-источник - source_table.
Если данные относятся к пайплайнам datestat или events, то материализация таблицы будет инкрементальной:
{{ config(
materialized='incremental',
order_by=('__date', '__table_name'),
incremental_strategy='delete+insert',
unique_key=['__date', '__table_name'],
on_schema_change='fail'
) }}
Для других пайплайнов материализация будет другой:
{{ config(
materialized='table',
order_by=('__table_name'),
on_schema_change='fail'
) }}
В автоматически генерируемом SQL-запросе в блоке SELECT будут выбраны все столбцы из ранее созданной source_table. Столбец table_name будет обёрнут в LowCardinality для улучшения производительности.
Если аргумент limit0 активирован, то в конце SQL-запроса будет добавлено LIMIT 0.
Файл в формате sql в папке models. Название файла:
combine_events
Содержимое файла:
-- depends_on: {{ ref('join_appmetrica_events') }}
-- depends_on: {{ ref('join_ym_events') }}
{{ datacraft.combine() }}
Это четвёртый из основных макросов.